package com.sinopac.model.TokenSynchronous;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import org.apache.commons.lang.StringUtils;
import MyOTP.OTPAdapter;
import java.io.*; 
import java.net.URLDecoder;
import java.util.*; 
import org.w3c.dom.*; 

import com.sinopac.util.XmlUtil;

import javax.xml.parsers.*; 

public class TokenSynchronousModel {
	
	public String errorMessage;
	public int return_code;
	public String return_code_ch;
	public File f;
	private static String filePath = "/OTPServer.xml";
	
	//轉換失敗代碼get中文
	private	HashMap<String,Object> return_codeMap;
	public String tokenSynchronous(String token_esn, String synSerCode, String synVerifCode){
		
//		String path = TokenSynchronousModel.class.getResource(filePath).getFile();
//		path = path.replaceAll("%20", " ");
//		
//		System.out.println("path:"+path);
//		
//		File f = new File(path);
//		
//		System.out.println("f.getPath():"+f.getPath());
		
		XmlUtil xml = new XmlUtil();
		xml.otpServer();
		
		//從設定檔取得OTPserver的IP
		String otpIP = xml.map.get("otpIP");
		//從設定檔取得OTPserver的password
		String otpPort = xml.map.get("otpPort");
		//從設定檔取得OTPserver的Issuer
		String otpIssuer = xml.map.get("otpIssuer");
		
		/*
		 * 測試用 
		 */
		System.out.println("otpIP:" + otpIP); 
		System.out.println("otpPort:" + otpPort); 
		System.out.println("otpIssuer:" + otpIssuer); 
		/*
		 * 測試用 
		 */
		
		
		//使用歐柏提供的API new Class出來用
		OTPAdapter adp = new OTPAdapter();
		//傳入參數進API，打開客戶的server
		adp.openSession(otpIP, otpPort, "", "", "10000");

		// 取得API傳回的連線代碼
		String clientID = adp.ClientID;
		
		/*
		 * 測試用 
		 */
		if (StringUtils.isNotBlank(clientID)) {
			System.out.println("clientID:" + clientID);
		} else {
			System.out.println("沒取得clientID");
		}
		/*
		 * 測試用 
		 */
		
		//產生亂數的序號，傳進API做ｌｏｇ使用
		String rn = randomSerialNumber();
		System.out.println("亂數序號rn:"+rn);
		
		//收call API傳回的代碼
		return_code = adp.syncDevice(otpIssuer,token_esn,synVerifCode,synSerCode,rn);
		//用map去轉換
		transReturn_code();
		//用map去取得代碼轉換後的中文
		return_code_ch = (String) return_codeMap.get(String.valueOf(return_code));
		
		//如果傳回的代碼為0代表成功
		if(return_code == 0){
			errorMessage = "成功";
		}else{
			errorMessage = "失敗";
		}
		
		//關閉客戶的server
		adp.closeSession(clientID);
		
		//回傳錯誤訊息
		return errorMessage;
	}

	//用map去做代碼轉換
	private void transReturn_code() {
		return_codeMap = new HashMap<String,Object>();
		return_codeMap.put("10", "作業失敗、驗證失敗");
		return_codeMap.put("11", "驗證失敗，已超過設定次數，載具被鎖");
		return_codeMap.put("12", "同步失敗");
		return_codeMap.put("13", "此資料未產生驗證碼");
		return_codeMap.put("14", "此資料已產生驗證碼");
		return_codeMap.put("15", "驗證碼已過期");
		return_codeMap.put("20", "使用者已存在");
		return_codeMap.put("21", "使用者不存在");
		return_codeMap.put("22", "使用者未啟用");
		return_codeMap.put("23", "使用者已暫禁");
		return_codeMap.put("30", "載具已存在");
		return_codeMap.put("31", "載具不存在");
		return_codeMap.put("32", "載具未啟用");
		return_codeMap.put("33", "載具已暫禁");
		return_codeMap.put("34", "載具未關連使用者");
		return_codeMap.put("35", "載具已關連使用者");
		return_codeMap.put("36", "載具已過期");
		return_codeMap.put("50", "授權已過期");
		return_codeMap.put("51", "使用者數量已達授權上限");
		return_codeMap.put("52", "載具數量已達授權上限");
		return_codeMap.put("60", "方法錯誤");
		return_codeMap.put("70", "參數資料錯誤");
	}
	
	//產生亂數的序號，傳進API做ｌｏｇ使用
	private String randomSerialNumber() {
		//2012-11-02 新增　用日期+兩位亂數當亂數序號
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
		StringBuffer sb = new StringBuffer(sdf.format(new Date()));
		
		int num = (int) (Math.random() * 99 + 1);// 先產生4位數字的亂數,不然長度不夠裝
		
		String rd = sb.deleteCharAt(14).toString()+String.valueOf(num);
		
		return rd;
	}

	public String getErrorMessage() {
		return errorMessage;
	}
	
	public int getReturn_code() {
		return return_code;
	}

	public String getReturn_code_ch() {
		return return_code_ch;
	}

}
